package com.itany.parser;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

/**
 * @author 陈华旺
 * @version 1.0
 * @date 2023年11月20日 11:15
 * @Description TODO
 */
public class ParserForJDKDom {
    public static void main(String[] args) {
//        通过 javax.xml.parsers.DocumentBuilderFactory 解析工厂进行xml解析
//        1. 构建解析工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
//            2. 基于解析工厂加载解析对象
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(
                    ParserForJDKDom.class
                            .getClassLoader()
                            .getResourceAsStream("school.xml")
            );
//            3. 基于读取的doc对象,获取xml的根标记
            Element school = doc.getDocumentElement();
//            System.out.println("root:"+root);
            System.out.println( "root:"+school.getTagName() );
//            4. 加载根标记内部的所有子标记
            NodeList childNodes = school.getChildNodes();
//            org.w3c.dom.NodeList 是一个特殊节点集合，依然可以循环调用
//            集合长度的获取使用 getLength()
            for (int i = 0; i < childNodes.getLength(); i++) {
//                NodeList 特殊节点集合提供元素获取方法 item(index) => 类似ArrayList.get(index)
                Node user = childNodes.item(i);
//                System.out.println("item("+user.getNodeType()+")"+user);
                if(user.getNodeType()==Node.ELEMENT_NODE){
//                    System.out.println("item("+item.getNodeType()+")"+item);
//                    System.out.println("itemTagName:"+item.getNodeName());
                    System.out.println("item-("+user.getNodeType()+")"+user.getNodeName());
//                      通过调用 getAttributes 方法获取当前标记上定义属性 ==> 对标记对象进行属性获取，文本对象是没有属性的
                    NamedNodeMap attributes = user.getAttributes();
//                    System.out.println(attributes);
                    for (int j = 0; j < attributes.getLength(); j++) {
                        System.out.println("item-user的属性:"+attributes.item(j)+"->"+attributes.item(j).getTextContent());
                    }
//                    继续获取当前节点子节点
                    NodeList itemChilds = user.getChildNodes();
                    for (int j = 0; j < itemChilds.getLength(); j++) {
                        Node childItem = itemChilds.item(j);
                        if(childItem.getNodeType()==Node.ELEMENT_NODE){
                            System.out.println("childItem("+childItem.getNodeType()+")"+childItem.getNodeName());
                            System.out.println( "childItem的节点内容:"+childItem.getTextContent() );
                        }
                    }
                }
            }
        }  catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }
}











